package com.sky.service.wx_user.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.WXShoppingCartMapper;
import com.sky.service.wx_user.WXShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@Service
public class WXShoppingCartServiceImpl implements WXShoppingCartService {
    @Autowired
    private WXShoppingCartMapper wxShoppingCartMapper;
    @Autowired
    private DishMapper dishMapper;
    @Autowired
    private SetmealMapper setmealMapper;

    /**
     * 添加购物车
     * @param dto
     */
    @Override
    public void addShoppingCart(ShoppingCartDTO dto) {
        //创建ShoppingCart对象
        ShoppingCart  cart = new ShoppingCart();
        //将前端传来的数据复制到cart对象中
        BeanUtils.copyProperties(dto,cart);
        //判断相应用户的购物车中是否有商品
        //只查对应用户的购物车数据
        cart.setUserId(BaseContext.getCurrentId());//通过线程池获取当前登录用户的id
        //查询对应用户的购物车是否有数据
        ShoppingCart cartService = wxShoppingCartMapper.getById(cart);
        //判断购物车在等于空的情况下进行新增
        if (cartService == null){
            log.info("购物车为空");
            //判断是新增套餐还是新增菜品
            if (dto.getDishId() != null){
                log.info("新增菜品");
                //代表前端传来的菜品id不为空所以是新增菜品
                //根据菜品id查询菜品数据
                Dish dish = dishMapper.getById(dto.getDishId());
                //根据查询的内容补全购物车数据
                cart.setName(dish.getName());//菜品名称
                cart.setImage(dish.getImage());//菜品图片
                cart.setAmount(dish.getPrice());//菜品价格
//            cart.setNumber(1);//菜品数量,默认为1份
//            cart.setCreateTime(LocalDateTime.now());//创建时间
            }else if (dto.getSetmealId() != null){
                log.info("新增套餐");
                //代表前端传来的套餐id不为空所以是新增套餐
                //根据套餐id查询套餐数据
                Setmeal setmeal = setmealMapper.getById(dto.getSetmealId());
                //根据查询的内容补全购物车数据
                cart.setName(setmeal.getName());
                cart.setImage(setmeal.getImage());
                cart.setAmount(setmeal.getPrice());
//            cart.setNumber(1);
//            cart.setCreateTime(LocalDateTime.now());//创建时间
            }
            //将重复代码抽取出来
            cart.setNumber(1);//菜品数量,默认为1份
            cart.setCreateTime(LocalDateTime.now());//创建时间
            //调用mapper的插入方法,将购物车数据插入数据库
            wxShoppingCartMapper.insert(cart);
        }else {//代表购物车有数据
            log.info("购物车有数据,更新数据");
            //将原来的商品数量加1,调用mapper的更新方法
            cartService.setNumber(cartService.getNumber() + 1);
            wxShoppingCartMapper.updateNumber(cartService);
        }
    }

    /**
     * 查看购物车
     * @return
     */
    @Override
    public List<ShoppingCart> list() {
        //调用mapper的查询方法,查询当前用户的购物车数据
        List<ShoppingCart> carts = wxShoppingCartMapper.list(BaseContext.getCurrentId());
        return carts;
    }

    /**
     * 清空购物车
     */
    @Override
    public void clean() {
        wxShoppingCartMapper.delete(BaseContext.getCurrentId());
        log.info("清空购物车成功");
    }

    /**
     * 删除购物车商品减一
     * @param dto
     */
 @Override
public void sub(ShoppingCartDTO dto) {
    // 1. 创建一个新的 ShoppingCart 对象
    ShoppingCart cart = new ShoppingCart();
    // 2. 将传入的 ShoppingCartDTO 对象属性复制到 cart 对象中（如商品ID、名称等）
    BeanUtils.copyProperties(dto, cart);
    // 3. 设置当前用户的 ID 到 cart 对象中，用于标识是哪个用户操作购物车
    cart.setUserId(BaseContext.getCurrentId());
    // 4. 调用 wxShoppingCartMapper 的 getById 方法，根据 cart 对象查询数据库中已有的购物车记录
    ShoppingCart cartService = wxShoppingCartMapper.getById(cart);
    // 5. 判断当前商品的数量是否为 1
    if (cartService.getNumber() == 1) {
        // 6. 如果数量为 1，则直接删除该商品记录
        log.info("成功删除id为{}的商品", cartService.getId());
        // 7. 调用 deleteById 方法删除对应 ID 的购物车记录
        wxShoppingCartMapper.deleteById(cartService.getId());
    } else {
        // 8. 如果数量大于 1，则将数量减 1
        cartService.setNumber(cartService.getNumber() - 1);
        // 9. 调用 updateNumber 方法更新数据库中的商品数量
        wxShoppingCartMapper.updateNumber(cartService);
        // 10. 记录日志：表示减少后还剩多少份
        log.info("当前还剩{}份", cartService.getNumber());
    }
}

}
